/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Monitores;

import java.util.ArrayList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Monitor que controla el acceso al Array con los path de los ficheros
 * descargados.
 *
 * @author felipe
 */
public class MonitorFicherosDescargados {

    private ArrayList<String> listaFicheros;
    private final Condition noHayFicheros;
    private final Lock lock;
    private int produccion;

    public MonitorFicherosDescargados() {
        this.listaFicheros = new ArrayList<>();
        this.lock = new ReentrantLock(true);
        this.noHayFicheros = lock.newCondition();
        this.produccion = 0;
    }

    /**
     * Introduce el path del ultimo fichero descargado.
     *
     * @param pathFichero
     */
    public void putFichero(String pathFichero) {
        lock.lock();
        try {
            listaFicheros.add(pathFichero);
            noHayFicheros.signal();
        } finally {
            lock.unlock();
        }
    }

    /**
     * Devuelve el path del siguiente fichero a guardar en BBDD.
     *
     * @return
     */
    public String getFichero() {
        lock.lock();
        String path = null;
        try {
            if (listaFicheros.isEmpty() && produccion != 0) {
                noHayFicheros.await();
            }
            if (!listaFicheros.isEmpty()) {
                path = listaFicheros.get(0);
                listaFicheros.remove(path);
                produccion--;
            } else {
                noHayFicheros.signal();
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(MonitorFicherosDescargados.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            lock.unlock();
            return path;
        }
    }

    /**
     * Si un path no esta disponible, el thread de desacarga utiliza este
     * metedo para descontar en uno la cantida de ficheros para almacenar
     * en Base de Datos.
     */
    public void pathNoDisponible() {
        produccion--;
    }

    /**
     * Fija el numero total, en principio, de ficheros a guardar en Base de Datos.
     * @param produccion 
     */
    public void setProduccion(int produccion) {
        this.produccion = produccion;
    }
}